package com.ruoyi.utils;

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GlobalPosition;


/**
 * 经纬度距离计算工具类 (使用Geodesy库计算)
 */
public class DistanceUtil {

    /**
     * 使用WGS84椭球体计算精确距离（米）
     */
    public static double calculateDistance(double lat1, double lng1,
                                           double lat2, double lng2) {
        GeodeticCalculator geoCalc = new GeodeticCalculator();
        Ellipsoid reference = Ellipsoid.WGS84;

        GlobalPoint point1 = new GlobalPoint(lat1, lng1);
        GlobalPoint point2 = new GlobalPoint(lat2, lng2);

        return geoCalc.calculateGeodeticCurve(reference, point1, point2).getEllipsoidalDistance();
    }

    /**
     * 计算距离并返回格式化字符串
     * @param lat1 点1的纬度
     * @param lng1 点1的经度
     * @param lat2 点2的纬度
     * @param lng2 点2的经度
     * @return 格式化后的距离字符串
     */
    public static String getFormattedDistance(double lat1, double lng1, double lat2, double lng2) {
        double distanceMeter = calculateDistance(lat1, lng1, lat2, lng2);

        if (distanceMeter < 1000) {
            return Math.round(distanceMeter) + "m";
        } else {
            double distanceKm = distanceMeter / 1000;
            return String.format("%.1fkm", distanceKm);
        }
    }

    /**
     * 坐标点包装类
     */
    private static class GlobalPoint extends GlobalPosition {
        public GlobalPoint(double latitude, double longitude) {
            super(latitude, longitude, 0.0); // 海拔设为0
        }
    }
}


